import { getUserProfileAPI } from '@/api/user.js'
import { getEmpInfoAPI } from '@/api/emp.js'
// 导入所有动态菜单对应的路由模块对象
import dynamicRoutes from '@/router/dynamicRoutes.js'
// 导入静态的左侧菜单项
// 默认导入的语法：
// import xxx from '模块'
// 按需导入的语法：
// import { xxx } from '模块'
// 默认导入和按需导入同时使用：
// import 默认导入的成员, { 按需导入的成员1, 按需导入的成员2 } from '模块'
import router, { constantRoutes, resetRouter } from '@/router'

// 返回一个基本的模块对象
export default {
  // 一定要为拆出去的模块，开启命名空间
  namespaced: true,
  // 模块的数据
  state() {
    return {
      // 用户登录后的 token，存储到这个位置
      token: '',
      // 用户的基本信息
      info: {},
      // 动态菜单对应的路由规则的数组
      // 希望在 @/layout/components/Sidebar/index.vue 组件中，
      // 基于下面名为 routes 的数组，动态渲染左侧的菜单项
      routes: []
    }
  },
  // 方法
  mutations: {
    // 为 token 赋值的方法
    updateToken(state, token) {
      state.token = token
    },
    // 把用户的信息，保存到 state 中
    updateInfo(state, info) {
      state.info = info
    },
    // 处理动态路由
    updateRoutes(state, menus) {
      // arr 空数组，用来存储路由规则
      const arr = []

      // 循环对象中的键
      for (const k in dynamicRoutes) {
        // 判断当前的菜单是否包含在用户的 menus 数组中
        if (menus.includes(k)) {
          arr.push(dynamicRoutes[k])
        }
      }

      // 在 for...in... 循环完成后，arr 中包含的是所有动态路由
      arr.push({ path: '*', redirect: '/404', hidden: true })

      // 把静态菜单和动态菜单进行合并
      state.routes = [...constantRoutes, ...arr]

      // 在每次添加动态路由之前，先重置 router 路由对象
      resetRouter()
      // 把动态路由，调用路由实例的 addRoutes 添加到路由规则中
      router.addRoutes(arr)
    },
    // 清空 routes 数组的函数
    cleanRoutes(state) {
      state.routes = []
    }
  },
  // 异步操作
  actions: {
    // 获取用户信息的 actions 函数
    async initUserInfo(ctx) {
      // 调用 API 接口，获取用户的基本信息【这个接口，只获取到了用户一半的信息】
      const profile = await getUserProfileAPI()
      // 调用获取员工基本信息的接口
      const emp = await getEmpInfoAPI(profile.data.userId)

      // 把用户和员工的信息，合二为一，才是用户的完整信息
      const userinfo = { ...profile.data, ...emp.data }
      console.log(userinfo)

      // 注意：如果在当前的 vuex 模块中，调用自己的 mutations 函数
      // 不需要携带模块的注册名称
      ctx.commit('updateInfo', userinfo)
      ctx.commit('updateRoutes', userinfo.roles.menus)
    }
  }
}
